/**
 * 资源权限中间件使用示例
 * 演示如何使用 createAuthMiddleware 进行细粒度的资源权限控制
 * 通过角色和权限控制替代 createResourceMiddleware
 */

const { UnifiedAuthMiddleware } = require('./auth.middleware');

/**
 * 示例1：商品资源权限控制
 * 使用 createAuthMiddleware 的 requirePermission 参数实现权限控制
 */

// 创建商品编辑权限中间件 - 使用权限控制
const productEditMiddleware = UnifiedAuthMiddleware.createAuthMiddleware({
    requireLogin: true,
    requirePermission: 'product:edit'  // 商品编辑权限
});

// 创建商品删除权限中间件 - 使用权限控制
const productDeleteMiddleware = UnifiedAuthMiddleware.createAuthMiddleware({
    requireLogin: true,
    requirePermission: 'product:delete'  // 商品删除权限
});

// 示例业务处理函数
async function editProductHandler() {
    const context = this;
    
    // 获取商品ID（从请求参数中）
    const productId = context.params.productId;
    
    // 业务逻辑：编辑商品
    console.log(`用户 ${context.userInfo._id} 正在编辑商品 ${productId}`);
    
    return {
        code: 200,
        message: '商品编辑成功',
        data: { productId }
    };
}

async function deleteProductHandler() {
    const context = this;
    
    // 获取商品ID
    const productId = context.params.productId;
    
    // 业务逻辑：删除商品
    console.log(`用户 ${context.userInfo._id} 正在删除商品 ${productId}`);
    
    return {
        code: 200,
        message: '商品删除成功',
        data: { productId }
    };
}

// 包装后的处理函数（实际使用）
const editProduct = productEditMiddleware(editProductHandler);
const deleteProduct = productDeleteMiddleware(deleteProductHandler);

/**
 * 示例2：订单资源权限控制
 * 使用 createAuthMiddleware 的 requirePermission 参数实现权限控制
 */

// 创建订单查看权限中间件 - 使用权限控制
const orderViewMiddleware = UnifiedAuthMiddleware.createAuthMiddleware({
    requireLogin: true,
    requirePermission: 'order:view'  // 订单查看权限
});

// 创建订单取消权限中间件 - 使用权限控制
const orderCancelMiddleware = UnifiedAuthMiddleware.createAuthMiddleware({
    requireLogin: true,
    requirePermission: 'order:cancel'  // 订单取消权限
});

async function viewOrderHandler() {
    const context = this;
    const orderId = context.params.orderId;
    
    console.log(`用户 ${context.userInfo._id} 正在查看订单 ${orderId}`);
    
    return {
        code: 200,
        message: '订单查看成功',
        data: { orderId }
    };
}

async function cancelOrderHandler() {
    const context = this;
    const orderId = context.params.orderId;
    
    console.log(`用户 ${context.userInfo._id} 正在取消订单 ${orderId}`);
    
    return {
        code: 200,
        message: '订单取消成功',
        data: { orderId }
    };
}

const viewOrder = orderViewMiddleware(viewOrderHandler);
const cancelOrder = orderCancelMiddleware(cancelOrderHandler);

/**
 * 示例3：细粒度资源权限控制实现
 * 演示如何使用 createAuthMiddleware 结合业务逻辑实现资源权限控制
 */

/**
 * 高级资源权限控制示例
 * 使用 createAuthMiddleware 进行基础权限验证，在业务逻辑中实现细粒度控制
 */

// 商品编辑权限中间件（基础权限验证 + 业务逻辑细粒度控制）
const advancedProductEditMiddleware = UnifiedAuthMiddleware.createAuthMiddleware({
    requireLogin: true,
    requirePermission: 'product:edit'  // 基础权限验证
})(async function() {
    const context = this;
    const productId = context.params.productId;
    
    // 细粒度权限检查：验证用户是否有权限编辑此特定商品
    const hasSpecificPermission = await checkProductEditPermission(context.userInfo, productId);
    if (!hasSpecificPermission) {
        return { code: 403, message: '没有权限编辑此商品' };
    }
    
    // 执行业务逻辑
    console.log(`用户 ${context.userInfo._id} 正在编辑商品 ${productId}`);
    
    return {
        code: 200,
        message: '商品编辑成功',
        data: { productId }
    };
});

// 订单查看权限中间件（基础权限验证 + 业务逻辑细粒度控制）
const advancedOrderViewMiddleware = UnifiedAuthMiddleware.createAuthMiddleware({
    requireLogin: true,
    requirePermission: 'order:view'  // 基础权限验证
})(async function() {
    const context = this;
    const orderId = context.params.orderId;
    
    // 细粒度权限检查：验证用户是否有权限查看此特定订单
    const hasSpecificPermission = await checkOrderViewPermission(context.userInfo, orderId);
    if (!hasSpecificPermission) {
        return { code: 403, message: '没有权限查看此订单' };
    }
    
    // 执行业务逻辑
    console.log(`用户 ${context.userInfo._id} 正在查看订单 ${orderId}`);
    
    return {
        code: 200,
        message: '订单查看成功',
        data: { orderId }
    };
});

/**
 * 权限检查辅助函数（在实际项目中需要实现数据库查询）
 */

// 检查商品编辑权限
async function checkProductEditPermission(userInfo, productId) {
    // 在实际项目中，这里需要查询数据库验证权限
    // 示例逻辑：
    // 1. 管理员拥有所有权限
    if (userInfo.role && userInfo.role.includes('admin')) {
        return true;
    }
    
    // 2. 检查用户是否是商品所有者
    // 需要查询商品表，验证 ownerId === userInfo._id
    // 这里使用模拟数据
    const mockProduct = { _id: productId, ownerId: 'user_789' };
    if (mockProduct.ownerId === userInfo._id) {
        return true;
    }
    
    return false;
}

// 检查订单查看权限
async function checkOrderViewPermission(userInfo, orderId) {
    // 在实际项目中，这里需要查询数据库验证权限
    // 示例逻辑：
    // 1. 管理员拥有所有权限
    if (userInfo.role && userInfo.role.includes('admin')) {
        return true;
    }
    
    // 2. 检查用户是否是订单创建者
    // 需要查询订单表，验证 userId === userInfo._id
    // 这里使用模拟数据
    const mockOrder = { _id: orderId, userId: 'user_789' };
    if (mockOrder.userId === userInfo._id) {
        return true;
    }
    
    return false;
}

/**
 * 使用示例
 */

// 模拟调用示例
async function demonstrateUsage() {
    // 模拟上下文对象
    const mockContext = {
        uniIdToken: 'valid_token',
        params: {
            productId: 'product_123',
            orderId: 'order_456'
        },
        product: {
            _id: 'product_123',
            ownerId: 'user_789',
            name: '示例商品'
        },
        order: {
            _id: 'order_456',
            userId: 'user_789',
            status: 'pending'
        }
    };
    
    console.log('=== 资源权限中间件使用示例 ===');
    
    // 测试商品编辑权限
    try {
        const result = await editProduct.call(mockContext);
        console.log('商品编辑结果:', result);
    } catch (error) {
        console.log('商品编辑失败:', error);
    }
    
    // 测试订单查看权限
    try {
        const result = await viewOrder.call(mockContext);
        console.log('订单查看结果:', result);
    } catch (error) {
        console.log('订单查看失败:', error);
    }
}

// 导出示例函数
module.exports = {
    editProduct,
    deleteProduct,
    viewOrder,
    cancelOrder,
    advancedProductEditMiddleware,
    advancedOrderViewMiddleware,
    demonstrateUsage,
    checkProductEditPermission,
    checkOrderViewPermission
};